#include "handler.h"
#include "../dir/cd.h"
#include "../login/login.h"

int handle_command(clientSession_t *session)
{

    // 参数检查
    if (session == NULL)
    {
        return -1;
    }

    clientSession_t *user_session = session;
    // 不断的获取用户发送的命令
    while (1)
    {
        char buf[1024] = {0};
        tlv_msg_t cmd_msg;
        bzero(&cmd_msg, sizeof(tlv_msg_t));
        // 接收用户命令，检查返回值
        int ret = tlv_recv(user_session->netfd, &cmd_msg);
        // 错误处理
        if (ret < 0)
        {
            // 出错，返回-1
            return -1;
        }
        if (ret == 1)
        {
            // 用户断连，返回1由调用者继续清理
            return 1;
        }
        // 分发命令
        switch (cmd_msg.hdr.type)
        {
        case CMD_CD:
            bzero(buf, sizeof(buf));
            memcpy(buf, cmd_msg.value, cmd_msg.hdr.length);
            cdFunc(user_session, buf);
            break;
        case CMD_LS:
            lsFunc(user_session);
            break;
        case CMD_PWD:
            pwdFunc(user_session);
            break;
        case CMD_PUTS_REQ:
            // TODO: 准备处理 puts（接收后续 DATA_CHUNK/DATA_END）
            put_file_to_serv(cmd_msg, session);
            break;
        case CMD_GETS_REQ:
            // TODO: 准备处理 gets（发送 DATA_CHUNK/DATA_END）
            get_file_from_serv(cmd_msg, session);
            break;
        case CMD_QUIT:
            // 用户正常退出，返回1由调用者继续清理
            return 1;
        case CMD_MKDIR:
            printf("进入mkdir\n"); // 服务端测试
            bzero(buf, sizeof(buf));
            memcpy(buf, cmd_msg.value, cmd_msg.hdr.length);
            mkdirFunc(user_session, buf);

            break;
        case CMD_RMDIR:
            printf("进入rmdir\n"); // 服务端测试
            bzero(buf, sizeof(buf));
            memcpy(buf, cmd_msg.value, cmd_msg.hdr.length);
            rmdirFunc(user_session, buf);
            break;
        default:
        {
            // 未知命令，返回一个简单响应通知客户端
            // TODO: 可能需要更复杂的错误处理，暂时先这样
            tlv_msg_t resp;
            const char *msg = "unknown command";
            if (tlv_create(&resp, CMD_RESPONSE, (int)strlen(msg), msg) == 0)
            {
                tlv_send(user_session->netfd, &resp);
            }
        }
        }
    }

    return 0;
}

int handle_login(clientSession_t *session)
{
    // 参数检查
    if (session == NULL)
    {
        return -1;
    }

    clientSession_t *user_session = session;
    // 不断的获取用户发送的登录请求
    while (1)
    {
        tlv_msg_t login_msg_username;
        bzero(&login_msg_username,sizeof(tlv_msg_t));
        // 先接收用户名，检查返回值
        int ret = tlv_recv(user_session->netfd, &login_msg_username);
        // 错误处理
        if (ret < 0)
        {
            // 出错，返回-1
            return -1;
        }
        if (ret == 1)
        {
            // 用户断连，返回1由调用者继续清理
            return 1;
        }
        // 检查是否为登录请求
        if (login_msg_username.hdr.type != DO_LOGIN)
        {
            // 非法请求，继续等待
            // 需要发送一个命令非法的响应
            tlv_msg_t resp;
            const char *msg = "invalid login request";
            tlv_create(&resp, LOGIN_FALSE, (int)strlen(msg), msg);
            continue;
        }
        tlv_msg_t login_msg_password;
        bzero(&login_msg_password,sizeof(tlv_msg_t));
        // 再接收密码，检查返回值
        ret = tlv_recv(user_session->netfd, &login_msg_password);
        // 错误处理
        if (ret < 0)
        {
            // 出错，返回-1
            return -1;
        }
        if (ret == 1)
        {
            // 用户断连，返回1由调用者继续清理
            return 1;
        }
        // 检查是否为登录请求
        if (login_msg_password.hdr.type != DO_LOGIN) // 假设CMD_RESPONSE用于登录请求
        {
            // 非法请求，继续等待
            // 需要发送一个命令非法tlv_msg_t resp;
            tlv_msg_t resp;
            const char *msg = "invalid login request";
            tlv_create(&resp, LOGIN_FALSE, (int)strlen(msg), msg);
            continue;
        }
        // TODO:调用用户的认证函数验证用户名和密码
        ret = do_login(user_session, login_msg_username.value, login_msg_password.value);
        if (ret == 0)
        {
            // 登录成功，返回0
            return 0;
        }
        // 登录失败，继续等待新的登录请求
    }

    return 0;
}
